#include "MyADC.h"

//ADC+DMA测试程序   V1.0           修改日期：2025/6/13
//实现功能：使用DMA转运ADC数据，并打印
//By:TAO XIN YU (陶鑫宇)


//ADC采样结果数组
unsigned short int adc_value[4]={0};

//初始化ADC及其DMA
//无参
//无返回值
void MyADC_init(void)
{
	//开启ADC相关时钟
	rcu_periph_clock_enable(RCU_GPIOA);
	rcu_periph_clock_enable(RCU_ADC);
	//开启DMA时钟
	rcu_periph_clock_enable(RCU_DMA);
	//设置ADC时钟源 6分频
	rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6);
	
	//配置ADC使用的引脚  PA0 PA1
	gpio_mode_set(MyADC_DEINIT_GPIOX,GPIO_MODE_ANALOG,
								GPIO_PUPD_NONE,MyADC_0_PIN | MyADC_1_PIN |
								MyADC_2_PIN | MyADC_3_PIN);
	
	//声明DMA参数配置结构体
	dma_parameter_struct dma_init_structure={0};
	//恢复DMA CH0缺省配置，防止出现意外错误
	dma_deinit(DMA_CH0);
	//配置DMA 外设地址（ADC外设数据地址）
	dma_init_structure.periph_addr = (unsigned int)(&ADC_RDATA);
	//配置DMA外设地址不自增
	dma_init_structure.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
	//配置DMA 存储器地址
	dma_init_structure.memory_addr = ((unsigned int)(&adc_value));
	//配置DMA 存储器地址自增
	dma_init_structure.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
	//配置DMA 外设数据深度 16位
	dma_init_structure.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
	//配置DMA 存储器数据深度 16位
	dma_init_structure.memory_width = DMA_MEMORY_WIDTH_16BIT;
	//配置DMA 数据转运方向 外设到存储器
	dma_init_structure.direction = DMA_PERIPHERAL_TO_MEMORY;
	//配置DMA 数据量 4
	dma_init_structure.number = MyADC_USEING_PIN_COUNTER;
	//配置DMA 优先级
  dma_init_structure.priority = DMA_PRIORITY_HIGH;
	//初始化DMA
	dma_init(DMA_CH0,&dma_init_structure);
	//使能循环模式
	dma_circulation_enable(DMA_CH0);
	//失能存储器到存储器
	dma_memory_to_memory_disable(DMA_CH0);
	//使能DMA通道
	dma_channel_enable(DMA_CH0);
	
	
	//ADC触发源设置 规则组，软件触发
	adc_external_trigger_source_config(ADC_REGULAR_CHANNEL,ADC_EXTTRIG_REGULAR_NONE);
	//ADC数据对齐方式，右对齐
	adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
	//ADC通道数 规则通道 4通道
	adc_channel_length_config(ADC_REGULAR_CHANNEL,MyADC_USEING_PIN_COUNTER);
	
	//配置规则通道参数  排序 通道号 采样时间
	adc_regular_channel_config(0,ADC_CHANNEL_0,ADC_SAMPLETIME_55POINT5);
	adc_regular_channel_config(1,ADC_CHANNEL_1,ADC_SAMPLETIME_55POINT5);
	adc_regular_channel_config(2,ADC_CHANNEL_2,ADC_SAMPLETIME_55POINT5);
	adc_regular_channel_config(3,ADC_CHANNEL_3,ADC_SAMPLETIME_55POINT5);
	
	//启用ADC外部通道组触发 规则组
	adc_external_trigger_config(ADC_REGULAR_CHANNEL,ENABLE);
	
	//非连续模式采样次数
	adc_discontinuous_mode_config(ADC_REGULAR_CHANNEL,3);
	
	//使能ADC
	adc_enable();
	//等待ADC稳定
	delay_1ms(1U);
	//ADC复位校准
	adc_calibration_enable();
	//ADC DMA 使能
	adc_dma_mode_enable();
	
	
}
	


